AWS Lake Formation のハイブリッドアクセスモードを利用する
こんにちは、川田です。
今回は AWS Lake Formation のハイブリッドアクセスモードを利用してみます。AWS Big Data Blog の記事や公式ドキュメントを参考に、単一 AWS アカウントで設定する場合の作業を確認してみます。
Lake Formation のハイブリッドアクセスモードとは
ハイブリッドアクセスモードとは、Glue Data Catalog を利用している既存利用者に影響を与える事なく、新規利用者に向けて Lake Formation でのアクセス管理を設定できる機能です。以下、ハイブリッドアクセスモードが発表された際の What's New 記事より引用します。
AWS Lake Formation は AWS Glue データカタログのハイブリッドアクセスモードの一般提供を発表しました。この機能により、AWS Glue データカタログのデータベースとテーブルで Lake Formation を選択的に有効にできる柔軟性が得られます。今回のリリース前は、テーブルの既存のユーザー全員を 1 ステップで Lake Formation に移動する必要がありました。そのためには、データ所有者とデータコンシューマーの間である程度の調整が必要でした。ハイブリッドアクセスモードにより、他の既存のユーザーやワークロードを中断することなく、特定のユーザーセットに対して Lake Formation を有効にできる増分パスができました。
AWS Lake Formation が AWS Glue データカタログのハイブリッドアクセスモードを開始
ハイブリッドアクセスモードを利用しない場合
ハイブリッドアクセスモードを利用せずに Lake Formation でのアクセス管理を行いたい場合、既存の利用者の権限設定を、Glue や S3 向けの IAM・リソースベースのものから、Lake Formation 向けのものに変更する必要があります。
以下、公式ドキュメントや Workshop の資料を参考に、必要となる作業を洗い出してみます。
- 利用者の現在のアクセス権限 (IAMベース・リソースベース)を洗い出す
- Lake Formation にて、利用者の IAM User が Glue Database および Table にアクセスできるよう、適切な Lake Formation Permission(リソースベース or タグベース)設定をする
- 利用者の IAM User に、Lake Formation 利用向けの IAM Policy を付与する
- Lake Formation にて、Glue Table の Permission から IAMAllowedPrincipals グループ向けの Super 権限を削除する
- Lake Formation にて、Glue Database の Permission から IAMAllowedPrincipals グループ向けの Super 権限を削除する
- Lake Formation にて、Glue Database および Table の Data lake locations 情報(S3 の Path 情報)を登録する
- Lake Formation にて、新規 Glue Database および Table 作成時の IAMAllowedPrincipals 利用設定を停止する
- 利用者の IAM User に対し、不要となった Glue および S3 向けの IAM Policy・リソースベース Policy を削除する
AWS Lake Formation モデルに対する AWS Glue データの許可のアップグレード
AWS Lake Formation Workshop - Migrate Permissions
そもそも、利用者 * Glue テーブル分の権限設定を洗い出し、Lake Formation の Permission に移し替えていく作業となるので、なかなかに骨の折れる作業になると思われます。
事前環境
ハイブリッドアクセスモードを設定する前に、事前の環境として以下を用意しています。
AWS リソース | 名前 |
---|---|
Data Lake 向け S3 Objects | s3://analytics-ap-northeast-1-zunda-demo/trip-data/ |
Glue Database | demo |
Glue Table | trip_data_green |
Glue Table | trip_data_yellow |
利用者向け IAM User | analyst-aaa |
S3 Objects。
$ aws s3 ls --recursive s3://analytics-ap-northeast-1-zunda-demo/trip-data/ 2024-03-27 01:44:13 1563684 trip-data/green/green_tripdata_2023-06.parquet 2024-03-27 01:43:45 54999465 trip-data/yellow/yellow_tripdata_2023-06.parquet
Glue テーブル。
$ aws glue get-tables --database-name demo --region ap-northeast-1 \ | jq -r '.TableList[] | [.DatabaseName, .Name, .StorageDescriptor.Location] | @tsv' demo trip_data_green s3://analytics-ap-northeast-1-zunda-demo/trip-data/green/ demo trip_data_yellow s3://analytics-ap-northeast-1-zunda-demo/trip-data/yellow/
利用者 analyst-aaa
は Athena を介して Data Lake にアクセスします。analyst-aaa
の IAM User には、Lake Formation 関連の IAM Policy は付与せず、必要となる Athena, Glue, S3 向けの Policy を付与させています。
Lake Formation 側では、以下の準備のみを実施しています。
- データレイク管理者用の IAM User を作成
- 必要となる IAM Policy を付与
- ペルソナに推奨される許可 - データレイク管理者の許可
- Lake Formation にて上記 IAM User を Data lake administrators として登録
Lake Formation ハイブリッドアクセスモードの設定
実際にハイブリッドアクセスモードを設定していきます。
検証の方法として、既存利用者 analyst-aaa
の設定はそのままに、新規利用者 analyst-bbb
を用意し、こちらを Lake Formation でのアクセス管理としてみます。
新規利用者向け IAM User の作成
新規利用者 analyst-bbb
の IAM User を作成します。ペルソナに推奨される許可 - データアナリストの許可 を参考に、必要となる IAM Policy を付与します。
$ aws iam create-user --user-name analyst-bbb $ aws iam create-login-profile --user-name analyst-bbb --password ******* $ aws iam attach-user-policy --user-name analyst-bbb --policy-arn arn:aws:iam::aws:policy/AmazonAthenaFullAccess $ policy=$(cat <<-EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess", "glue:GetTable", "glue:GetTables", "glue:SearchTables", "glue:GetDatabase", "glue:GetDatabases", "glue:GetPartitions", "lakeformation:GetResourceLFTags", "lakeformation:ListLFTags", "lakeformation:GetLFTag", "lakeformation:SearchTablesByLFTags", "lakeformation:SearchDatabasesByLFTags" ], "Resource": "*" } ] } EOF ) $ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-lf-data-analyst --policy-document "${policy}" $ policy=$(cat <<-EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lakeformation:StartTransaction", "lakeformation:CommitTransaction", "lakeformation:CancelTransaction", "lakeformation:ExtendTransaction", "lakeformation:DescribeTransaction", "lakeformation:ListTransactions", "lakeformation:GetTableObjects", "lakeformation:UpdateTableObjects", "lakeformation:DeleteObjectsOnCancel" ], "Resource": "*" } ] } EOF ) $ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-lf-data-analyst-lf --policy-document "${policy}" $ # Athena Query の出力先として s3://aws-athena-query-results-* を設定(必要に応じ、環境にあったバケット名に変更する) $ policy=$(cat <<-EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Put*", "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::aws-athena-query-results-*" } ] } EOF ) $ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-athena-result-bucket --policy-document "${policy}"
重要な点が、Data Lake の S3 Objects s3://analytics-ap-northeast-1-zunda-demo/trip-data/
向けのアクセス権を付与していない事です。そのため、この状態で Athena からクエリを実行しても AccessDenied となります。
Lake Formation の IAMAllowedPrincipals グループについて
ハイブリッドアクセスモードを設定する前に、Lake Formation で用意されている IAMAllowedPrincipals グループの仕組みについて触れます。
まず、現時点で Lake Formation に登録されているテーブルでは、以下の設定になっています。
- Data access mode が Lake Formation 外 (Other) となっている
- Lake Formation Permission の影響を受けるユーザーがいない (Lake Formation permissions enforced for が No users である)
続いて、Lake Formation の Permissions 設定を確認すると、以下となっています。Principal IAMAllowedPrincipals
グループに Permissions All
が与えられています。
IAMAllowedPrincipals
グループの説明について、公式ドキュメントより引用します。
Lake Formation sets
Super
permission on all databases and tables in the Data Catalog to a group calledIAMAllowedPrincipals
by default. If this group permission exists on a database or a table, all principals in your account will have access to the resource through the IAM principal policies for AWS Glue. It provides backward compatibility when you start using Lake Formation permissions to secure the Data Catalog resources that were earlier protected by IAM policies for AWS Glue.
Lake Formation は、デフォルトで Data Catalog 内のすべてのデータベースとテーブルの
Super
権限をIAMAllowedPrincipals
というグループに設定します。このグループ権限がデータベースやテーブルに存在する場合、アカウント内のすべてのプリンシパルは、AWS Glue の IAM プリンシパルポリシーを通じてリソースにアクセスできます。これは、以前は AWS Glue 用の IAM ポリシーで保護されていた Data Catalog リソースを保護するために Lake Formation 権限を使用し始めたときの下位互換性を提供します。
When you use Lake Formation to manage permissions for your Data Catalog resources, you need to first revoke the
IAMAllowedPrincipals
permission on the resources, or opt in the principals and the resources to hybrid access mode for Lake Formation permissions to work.
Lake Formation を使用して Data Catalog リソースのパーミッションを管理する場合、Lake Formation のパーミッションを機能させるには、まずリソースの
IAMAllowedPrincipals
パーミッションを取り消すか、プリンシパルとリソースをハイブリッドアクセスモードにオプトインする必要があります。
Lake Formation permissions reference - Principal is an IAM group - IAMAllowedPrincipals
記載ある通り、ハイブリッドアクセスモードを利用しない場合、IAMAllowedPrincipals
グループ向けの権限を取り外さないと Lake Formation での Permissions 設定が機能しません。しかし一方で、IAMAllowedPrincipals
グループ向けの権限を取り外すと、下位互換性が維持されなくなり、IAM ポリシー(とリソースベースポリシー)で設定していた権限が無効となる事になります。つまり、必要な権限設定を全て Lake Formation 側に移す必要がでてきます。
そこでハイブリッドアクセスモードを利用する事になる訳です。
ハイブリッドアクセスモードを設定する
それでは、上記で作成した analyst-bbb
ユーザー向けに、ハイブリッドアクセスモードを設定していきます。以降で実行している AWS CLI コマンドは、すべてデータレイク管理者の IAM User にて実行されているものになります。
Data lake locations の登録
Data lake の S3 Path 情報を、Data lake locations にハイブリッドアクセスモードにて登録します。今回は検証目的として、trip_data_green テーブル側の Path のみを登録します。
$ aws lakeformation register-resource --region ap-northeast-1 \ --resource-arn arn:aws:s3:::analytics-ap-northeast-1-zunda-demo/trip-data/green \ --use-service-linked-role \ --hybrid-access-enabled
タグベースの Lake Formation Permissions を設定
今回利用する LF-Tag の Key と Value {"demo": ["green", "yello"]}
を登録します。
$ aws lakeformation create-lf-tag --region ap-northeast-1 \ --tag-key demo \ --tag-values green yellow
trip_data_green テーブルに、登録したタグ demo を value が green を条件として割り当てます。
$ aws lakeformation add-lf-tags-to-resource --region ap-northeast-1 \ --resource '{ "Table": {"DatabaseName":"demo", "Name":"trip_data_green"}}' \ --lf-tags TagKey=demo,TagValues=green
IAM ユーザー analyst-bbb 向けに、{"demo": "green"}
のタグベースで Permissions を付与します。
$ json=$(cat <<-EOF { "Principal": { "DataLakePrincipalIdentifier": "arn:aws:iam::123456789012:user/analyst-bbb" }, "Resource": { "LFTagPolicy": { "ResourceType": "DATABASE", "Expression": [ { "TagKey": "demo", "TagValues": [ "green" ] } ] } }, "Permissions": [ "DESCRIBE" ] } EOF ) $ aws lakeformation grant-permissions --region ap-northeast-1 --cli-input-json "${json}" $ $ json=$(cat <<-EOF { "Principal": { "DataLakePrincipalIdentifier": "arn:aws:iam::123456789012:user/analyst-bbb" }, "Resource": { "LFTagPolicy": { "ResourceType": "TABLE", "Expression": [ { "TagKey": "demo", "TagValues": [ "green" ] } ] } }, "Permissions": [ "DESCRIBE", "SELECT" ] } EOF ) $ aws lakeformation grant-permissions --region ap-northeast-1 --cli-input-json "${json}"
Lake Formation permissions 強制のオプトイン
ハイブリッドアクセスモードを利用する場合、Lake Formation 側の権限で管理したい principal と、その principal がアクセスするリソースの情報をオプトインする必要があります。今回の場合、analyst-bbb
ユーザーが demo.trip_data_green
テーブルへのアクセス時に Lake Formation permissions を強制するようオプトインを実行します。
$ aws lakeformation create-lake-formation-opt-in --region ap-northeast-1 \ --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:user/analyst-bbb \ --resource '{ "Table": { "DatabaseName": "demo", "Name": "trip_data_green" }}'
以上で必要な設定は完了です。
設定の確認
設定後の Lake Formation の画面を確認しておきます。
Lake Formation に登録されているテーブルの情報が、以下の設定に変わっています。
- trip_data_green テーブルの Data access mode が Hybrid Access となっている
- Lake Formation Permission の影響を受けるユーザーが Some users となっている
Lake Formation Permissions の情報は以下となっています。
- IAMAllowedPrincipals グループが demo データベース内のテーブルに All 権限を持っている(変化なし)
- analyst-bbb ユーザーが、タグベースの Permissions を持っている
オプトインした情報の確認をしてみます。上記でコマンド実行した内容が登録されています。
Athena からの検索結果を確認
Athena からクエリを実行し、正しくアクセス管理を行えているか確認します。
analyst-bbb
ユーザーで AWS コンソールにログインします。
demo.trip_data_green
テーブルに対してクエリを実行します。成功します。
demo.trip_data_yellow
テーブルに対してクエリを実行します。こちらは Lake Formation Permissions を設定していないため失敗します。
続いて analyst-aaa
ユーザーで AWS コンソールにログインします。
demo.trip_data_green
テーブルに対してクエリを実行します。成功します。これは IAMAllowedPrincipals グループの設定を介して Lake Formation Permissions を設定がバイパスされ、既存で設定されている IAM・リソースベースのポリシーにてアクセス権を取得しているからとなります。
補足: Lake Formation の Data Catalog settings について
Lake Formation の Data Catalog settings
内 Default permissions for newly created databases and tables
のチェックボックスは、新規で作成されたデータベースとテーブルに対する IAMAllowedPrincipals グループの設定動作を指定するものです。
このチェックボックスをアンチェックすると、新規で作成されたデータベースとテーブルには IAMAllowedPrincipals グループの Permission 設定が登録されないようになります。もし以降に作成されるデータベースとテーブルのアクセス権を Lake Formation 管理としたい場合、アンチェックしておく必要があります。